#ifndef _IMAGELAYER_HPP_
#define _IMAGELAYER_HPP_

#include <boost/gil/image_view.hpp>
#include "../ged/typedefs.hpp"

namespace ged {

//! Klasa repzerentująca warstwę obrazka
/*!
 * Klasa reprezentuje warstwę obrazka. Jest skojarzona z dokładnie
 * jednym obrazem GIL (boost::gil::image<>). Implementuje wzorzec
 * Memento (metody getView() i setView()).
 */
class ImageLayer {
public:
	//! Typ widoku GIL (boost::gil:image_view<>) używanego przez
	//! warstwę
	typedef GILImageView view_type;

	//! Konstruktor
	/*!
	 * \param image sprytny wskaźnik na obrazek GIL
	 */
	explicit ImageLayer(PGILImage image);

	//! Zwraca bieżący widok GIL warstwy
	/*!
	 * Zwracany widok może być użyty jako Memento dla tej klasy.
	 *
	 * \return bieżący widok GIL warstwy
	 * \sa setView()
	 */
	const view_type getView() const;

	//! Przypisuje warstwie nowy widok GIL
	/*!
	 * Metoda może być użyta do przywrócenia warstwie widoku
	 * uprzednio pozyskanego przy użyciu metody getView().
	 *
	 * \param v nowy widok GIL warstwy
	 * \sa getView()
	 */
	void setView(const view_type& v);

	//! Ustawia przesunięcie warstwy względem początku obrazka
	/*!
	 * \param offset nowe przesunięcie
	 */
	void setOffset(const GILPoint& offset);

	//! Zwraca przesunięcie warstwy względem początku obrazka
	/*!
	 * \return przesunięcie warstwy względem początku obrazka
	 */
	const GILPoint getOffset() const;

	//! Zwraca rozmiar warstwy
	/*!
	 * \return rozmiar warstwy
	 */
	const GILPoint getDimensions() const;

	//! Wrapper operatora () widoku GIL skojarzonego z warstwą
	/*!
	 * Umożliwia dostęp do wartości piksela.
	 *
	 * \param p współrzędne piksela
	 * \return referencja do wartości piksela
	 */
	view_type::reference operator()(const GILPoint& p) const;

private:
	//! Obraz GIL skojarzony z warstwą
	PGILImage image_;
	//! Widok na obraz GIL skojarzony z warstwą
	GILImageView view_;
	//! Przesunięcie warstwy względem obrazka
	GILPoint offset_;
};

} // namespace ged

#endif	// _IMAGE_LAYER_HPP_

